#include <iostream>
#include <functional>
#include <map>

int add(int a, int b)
{
    return a + b;
}

int minus(int a, int b)
{
    return a - b;
}

int multiply(int a, int b)
{
    return a * b;
}

int divide(int a, int b)
{
    return a / b;
}

// switch case分支（分支一多就显得太冗余了，代码可读性就下降）
// int calculate(int a, int b, char symbol)
// {
//     switch (symbol)
//     {
//     case '+':
//         add(a, b);
//         break;

//     case '-':
//         minus(a, b);
//         break;

//     case '*':
//         multiply(a, b);
//         break;

//     case '/':
//         divide(a, b);
//         break;

//     default:
//         break;
//     }
// }

// 注册机（可以用来替代switch case分支）
std::map<char, std::function<int(int, int)>> m;

int calculate(int a, int b, char symbol)
{
    return m[symbol](a, b);
}    

int main()
{
#if 0
    m['+'] = add;
    m['-'] = minus;
    m['*'] = multiply;
    m['/'] = divide;

    std::cout << calculate(1, 2, '+') <<std::endl; 
    return 0;
#endif

#if 1
    // 适配器：将原有逻辑改动以后适应新的逻辑
    // 函数绑定器
    // std::placeholders：占位符
    // auto f = std::bind(add, std::placeholders::_1, std::placeholders::_2, 0);
    auto f = [](int a, int b){ return add(a, b, 0);};
    
    m['+'] = f;
    m['-'] = minus;
    m['*'] = multiply;
    m['/'] = divide;
    

    std::cout << calculate(1, 2, '+') <<std::endl; 
#endif
}